package j.util.jdbc.simple.core;

import j.util.New;
import j.util.StringUtils;
import j.util.jdbc.simple.core.support.SqlUtils;
import j.util.jdbc.simple.metadata.TableMetaData;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 查询语句的构造
 * @author 刘军海
 * @version Sep 15, 2011 9:47:44 AM
 */
public class SQLForQuery {

	private TableMetaData tmd;
	public SQLForQuery(TableMetaData tmd){
		this.tmd = tmd;
	}
	
	private String findByPkSql;
	private List<String> findByPkSqlOrder;
	
	/**
	 * 获取根据表的主键而构造的查询语句，同时设置该查询语句的参数顺序
	 * @return
	 */
	public String getFindByPkSql(){
		if(StringUtils.isNullOrEmpty(findByPkSql)){
			synchronized(this){
				if(StringUtils.isNullOrEmpty(findByPkSql)){
					_createFindByPkSql();
				}
			}
		}
		return this.findByPkSql;
	}
	/**
	 * 根据主键查询语句的参数顺序
	 * @return
	 */
	public List<String> getFindByPkSqlOrder(){
		return this.findByPkSqlOrder;
	}

	/**
	 * 根据表的主键构造查询语句
	 */
	private void _createFindByPkSql() {
		if(StringUtils.isNullOrEmpty(tmd.getPkColumns())){
			return;
		}
		findByPkSqlOrder = New.list();
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT * FROM ")
			.append(tmd.getTableName());
		String where = SqlUtils.fromCompositeColumnsToWhereSql(tmd.getPkColumns(), findByPkSqlOrder);
		sql.append(" WHERE ").append(where);
		findByPkSql = sql.toString();
	}
	/**
	 * 根据参数、排序构造查询列表的语句
	 * @param args
	 * @param orders
	 * @param argsOrder 参数顺序
	 * @return
	 */
	public String generateQuerySql(Map<String, Object> args, 
			Map<String, String> orders,List<String> argsOrder){
		StringBuilder sql = new StringBuilder("SELECT");
		//构造查询列表
		Set<String> usedColumns = tmd.getQueryAttribute().getUsedColumnsForList();
		if(null==usedColumns || usedColumns.size() == 0){
			sql.append(" * ");
		}else{
			int i = 0;
			for(String s : usedColumns){
				if(i>0){
					sql.append(",");
				}
				sql.append(" ").append(s).append(" ");
			}
		}
		//附加表名
		sql.append("FROM ").append(tmd.getTableName());
		//构造where语句
		String where = SqlUtils.fromArgsToWhereSql(tmd.getEntityAttributeColumnMap(), args, argsOrder);
		if(StringUtils.isNotEmpty(where)){
			sql.append(" WHERE ").append(where);
		}
		//构造排序
		String order = SqlUtils.fromMapToOrderby(tmd.getEntityAttributeColumnMap(), orders);
		if(StringUtils.isNotEmpty(order)){
			sql.append(" ORDER BY ").append(order);
		}
		return sql.toString();
	}
}
